home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Reference Guide / C-C++ Interactive Reference Guide.iso / c_ref / csource3 / 106_01 / xtrinslb.prn < prev   
Encoding:
Text File  |  1980-07-09  |  19.4 KB  |  394 lines

  1. Xtract field from and insert field into buffer    MACRO-80 3.31    29-Jun-79    PAGE    1
  2.  
  3.  
  4.     1                                        title    Xtract field from and insert field into buffer
  5.     2                                        name    ('XTRINS')
  6.     3                                        ;
  7.     4                                        ; This is intended for use with Microsoft 'M80' and 'L80'
  8.     5                                        ;
  9.     6                                        .list    ; re-enable listing
  10.     7                                        ;
  11.     8                                        ;
  12.     9                                        ;++ **************************************************
  13.    10                                        ;
  14.    11                                        ; TO USE THIS ROUTINE:
  15.    12                                        ;
  16.    13                                        ;    M80 XTRINSLB=XTRINSLB        ...Microsoft 'M80'
  17.    14                                        ;    L80 XTRINSLB,XTRINSLB/N/E    ...Microsoft 'L80'
  18.    15                                        ;    REN BIOS.CRL=BIOS.COM
  19.    16                                        ;
  20.    17                                        ;    XTRINSLB.CRL WILL BE A 'C' COMPATIBLE RELOCATABLE FILE
  21.    18                                        ;    WHICH CAN BE REQUESTED AT CLINK OR INTEGRATED
  22.    19                                        ;    INTO YOUR LIBRARY WITH CLIB
  23.    20                                        ;
  24.    21                                        ;-- **************************************************
  25.    22                                        ;
  26.    23      03F7                          MAGIC    equ    3F7H        ;'C' PARAMETER PASSING BUFFER
  27.    24                                        ;
  28.    25      0000'                             aseg
  29.    26                                        org    100H
  30.    27                                        .phase    0
  31.    28                                        ;
  32.    29      0000    49 4E 53 45           ZERO:    dc    'INSERT'    ; Name of insert function
  33.    30      0004    52 D4                 
  34.    31      0006    0205                      dw    INSHEAD        ; Location of insert function
  35.    32      0008    58 54 52 41               dc    'XTRACT'    ; Name of xtract function
  36.    33      000C    43 D4                 
  37.    34      000E    0284                      dw    XTRHEAD        ; Location of xtract function
  38.    35                                        ;
  39.    36      0010    80                        db    80H        ;END OF DIRECTORY ENTRIES
  40.    37      0011    02C8                      dw    FINIS - 100H    ;POINTER TO NEXT AVAIL LOCATION IN FILE
  41.    38      0013                              ds    (512 -($-ZERO))    ;PAD REST OF DIRECTORY
  42.    39      0200                              ds    5        ;RESERVED FOR 'CLIB'
  43.    40                                        ;
  44.    41                                        .dephase
  45.    42                                        ;
  46.    43                                        page
  47. Xtract field from and insert field into buffer    MACRO-80 3.31    29-Jun-79    PAGE    1-1
  48.  
  49.  
  50.    44      0305                          
  51.    45                                        ;
  52.    46                                        ;++ ****************************************
  53.    47                                        ;
  54.    48                                        ;$$ INSERT    -- Insert bit field into a byte array
  55.    49                                        ;
  56.    50                                        ;    Bits are numbered 1..N
  57.    51                                        ;    Width may be 1..16
  58.    52                                        ;
  59.    53                                        ;    Storage format is:
  60.    54                                        ;
  61.    55                                        ;           msb    lsb
  62.    56                                        ;
  63.    57                                        ;        8      1    first byte of array
  64.    58                                        ;           16      9
  65.    59                                        ;        .      .
  66.    60                                        ;        .      .
  67.    61                                        ;        N      N-8    last byte of array
  68.    62                                        ;
  69.    63                                        ; insert(array,data,start,width)
  70.    64                                        ;    char *array;
  71.    65                                        ;    unsigned data;
  72.    66                                        ;    char start,width;
  73.    67                                        ;    {
  74.    68                                        ;      .
  75.    69                                        ;      .
  76.    70                                        ;      return 0;
  77.    71                                        ;    }
  78.    72                                        ;
  79.    73                                        ;
  80.    74                                        ; Warning:    array must be at least
  81.    75                                        ;        (start+width)/8 bytes long
  82.    76                                        ;
  83.    77                                        ;-- ****************************************
  84.    78                                        ;
  85.    79                                        .phase    $-100H
  86.    80                                        ;
  87.    81                                    INSHEAD:
  88.    82      0205    00                        db    0    ; No external functions used
  89.    83      0206    007A                      dw    INSTOP-INSERT    ; length of function INSERT
  90.    84                                        ;
  91.    85                                        .dephase
  92.    86                                        ;
  93.    87                                        ; Body of function INSERT
  94.    88                                        ;
  95. Xtract field from and insert field into buffer    MACRO-80 3.31    29-Jun-79    PAGE    1-2
  96.  
  97.  
  98.    89                                        .phase    0
  99.    90                                        ;
  100.    91      0000    2A 03F7               INSERT:    LHLD    MAGIC    ; HL = .(byte array)
  101.    92                                        LDED    MAGIC+2    ; DE = data to be inserted
  102.    93      0003    ED 5B                       db    0EDH,5BH
  103.    94      0005    03F9                        dw    MAGIC+2
  104.    95                                        LBCD    MAGIC+4    ;  C = starting bit number
  105.    96      0007    ED 4B                       db    0EDH,4BH
  106.    97      0009    03FB                        dw    MAGIC+4
  107.    98      000B    3A 03FD                   LDA    MAGIC+6
  108.    99      000E    47                        MOV    B,A    ;  B = field width in bits
  109.   100      000F    0D                        DCR    C    ; bit no. 1..256 -> 0..255
  110.   101      0010    E5                        PUSH    H    ; save pointer to array
  111.   102      0011    21 0001                   LXI    H,1    ; calculate data mask
  112.   103      0014    29                    MSLUP:    DAD    H
  113.   104                                        DJNZ    MSLUP
  114.   105      0015    10 FD                       db    10H,MSLUP-$-1
  115.   106      0017    2B                        DCX    H    ; HL = 2**width -1
  116.   107      0018    7B                        MOV    A,E
  117.   108      0019    A5                        ANA    L    ; mask the data to be inserted
  118.   109      001A    5F                        MOV    E,A
  119.   110      001B    7A                        MOV    A,D
  120.   111      001C    A4                        ANA    H
  121.   112      001D    57                        MOV    D,A
  122.   113      001E    7C                        MOV    A,H    ; invert the mask so it can force zeroes
  123.   114      001F    2F                        CMA
  124.   115      0020    67                        MOV    H,A
  125.   116      0021    7D                        MOV    A,L
  126.   117      0022    2F                        CMA
  127.   118      0023    6F                        MOV    L,A
  128.   119      0024    E3                        XTHL        ; HL = .(array), stack = inverted mask
  129.   120      0025    79                        MOV    A,C    ; calc byte offset
  130.   121      0026    E6 F8                     ANI    not 7
  131.   122      0028    0F                        RRC
  132.   123      0029    0F                        RRC
  133.   124      002A    0F                        RRC
  134.   125      002B    85                        ADD    L
  135.   126      002C    6F                        MOV    L,A
  136.   127                                        JRNC    ADOK
  137.   128      002D    30 01                       db    30H,ADOK-$-1
  138.   129      002F    24                        INR    H    ; HL = .(three bytes of interest)
  139.   130      0030    79                    ADOK:    MOV    A,C    ; calc bit in byte i.e. bitno. mod 8
  140.   131      0031    E6 07                     ANI    7
  141.   132      0033    3C                        INR    A    ; 0..7 -> 1..8
  142.   133      0034    4F                        MOV    C,A    ; save for right justify shift
  143.   134      0035    47                        MOV    B,A    ; again for left justify shift
  144. Xtract field from and insert field into buffer    MACRO-80 3.31    29-Jun-79    PAGE    1-3
  145.  
  146.  
  147.   135      0036    EB                        XCHG        ; DE = .(bytes of interest)
  148.   136      0037    E3                        XTHL        ;stack = data to be inserted, HL = inverted mask
  149.   137      0038    E5                        PUSH    H    ; stack = inverted mask
  150.   138      0039    13                        INX    D    ; get 3 byte of interest in H'L'A
  151.   139      003A    13                        INX    D
  152.   140      003B    1A                        LDAX    D
  153.   141      003C    67                        MOV    H,A
  154.   142      003D    1B                        DCX    D
  155.   143      003E    1A                        LDAX    D
  156.   144      003F    6F                        MOV    L,A
  157.   145      0040    1B                        DCX    D
  158.   146      0041    1A                        LDAX    D
  159.   147      0042    B7                    RJLUP:    ORA    A
  160.   148      0043    0D                        DCR    C
  161.   149                                        JRZ    RJDUN    ; Is right justification complete ?
  162.   150      0044    28 0B                       db    28H,RJDUN-$-1
  163.   151                                        RARR    H    ; No
  164.   152      0046    CB 1C                       db    0CBH, 18H +H
  165.   153                                        RARR    L
  166.   154      0048    CB 1D                       db    0CBH, 18H +L
  167.   155      004A    1F                        RAR
  168.   156                                        JRNC    RJLUP
  169.   157      004B    30 F5                       db    30H,RJLUP-$-1
  170.   158                                        SETB    7,H
  171.   159      004D    CB FC                       db    0CBH,7*8+H+0C0H
  172.   160                                        JMPR    RJLUP
  173.   161      004F    18 F1                       db    18H,RJLUP-$-1
  174.   162                                        ;
  175.   163      0051    EB                    RJDUN:    XCHG        ; HL = .(bytes of interest), DE = rj data
  176.   164      0052    E3                        XTHL        ; HL = inverted mask, stack = .(bytes o i)
  177.   165      0053    A5                        ANA    L
  178.   166      0054    6F                        MOV    L,A
  179.   167      0055    7B                        MOV    A,E
  180.   168      0056    A4                        ANA    H
  181.   169      0057    5F                        MOV    E,A
  182.   170      0058    7D                        MOV    A,L    ; D'E'A = rj field masked to zeroes
  183.   171      0059    E1                        POP    H
  184.   172      005A    E3                        XTHL        ; HL = data to be inserted, stack = .(bytes o i)
  185.   173      005B    B5                        ORA    L    ; or in the data to be inserted
  186.   174      005C    6F                        MOV    L,A
  187.   175      005D    7B                        MOV    A,E
  188.   176      005E    B4                        ORA    H
  189.   177      005F    5F                        MOV    E,A
  190.   178      0060    7D                        MOV    A,L
  191.   179                                                ;B = shift count to re-justify as was originally
  192.   180      0061    B7                    LJLUP:    ORA    A
  193. Xtract field from and insert field into buffer    MACRO-80 3.31    29-Jun-79    PAGE    1-4
  194.  
  195.  
  196.   181      0062    05                        DCR    B
  197.   182                                        JRZ    LJDUN    ; Is left justify complete ?
  198.   183      0063    28 0B                       db    28H,LJDUN-$-1
  199.   184      0065    17                        RAL        ; No
  200.   185                                        RALR    E
  201.   186      0066    CB 13                       db    0CBH, 10H+E
  202.   187                                        RALR    D
  203.   188      0068    CB 12                       db    0CBH, 10H+D
  204.   189                                        JRNC    LJLUP
  205.   190      006A    30 F5                       db    30H,LJLUP-$-1
  206.   191                                        SETB    0,A
  207.   192      006C    CB C7                       db    0CBH,0*8+A+0C0H
  208.   193                                        JMPR    LJLUP
  209.   194      006E    18 F1                       db    18H,LJLUP-$-1
  210.   195                                        ;
  211.   196      0070    E1                    LJDUN:    POP    H    ; Hl = .(bytes of interest)
  212.   197      0071    77                        MOV    M,A
  213.   198      0072    23                        INX    H
  214.   199      0073    73                        MOV    M,E
  215.   200      0074    23                        INX    H
  216.   201      0075    72                        MOV    M,D    ; modified bytes of interest restored
  217.   202      0076    21 0000                   LXI    H,0    ; Function value returned
  218.   203      0079    C9                        RET        ; and exit
  219.   204                                    INSTOP:
  220.   205      007A    0000                      dw    0    ; No non-intrinsic relocatable references
  221.   206                                        ;
  222.   207                                        .dephase
  223.   208                                        ;
  224.   209                                        page
  225. Xtract field from and insert field into buffer    MACRO-80 3.31    29-Jun-79    PAGE    1-5
  226.  
  227.  
  228.   210      0384                          
  229.   211                                        ;
  230.   212                                        ;++ ****************************************
  231.   213                                        ;
  232.   214                                        ;$$ EXTRACT -- Extract a bit field from a
  233.   215                                        ;        -- multi-byte buffer
  234.   216                                        ;
  235.   217                                        ;    Bits are numbered 1..N
  236.   218                                        ;    Width may be 1..16
  237.   219                                        ;
  238.   220                                        ;    Storage format is presumed to be:
  239.   221                                        ;
  240.   222                                        ;           msb    lsb
  241.   223                                        ;
  242.   224                                        ;        8      1    first byte of array
  243.   225                                        ;           16      9
  244.   226                                        ;        .      .
  245.   227                                        ;        .      .
  246.   228                                        ;        N      N-8    last byte of array
  247.   229                                        ;
  248.   230                                        ;
  249.   231                                        ; xtract(array,start,width)
  250.   232                                        ;    char *array;
  251.   233                                        ;    char start,width;
  252.   234                                        ;    {
  253.   235                                        ;    .
  254.   236                                        ;    .
  255.   237                                        ;    return <extracted value>;
  256.   238                                        ;    }
  257.   239                                        ;
  258.   240                                        ;
  259.   241                                        ;-- ****************************************
  260.   242                                        ;
  261.   243                                        .phase    $-100H
  262.   244                                        ;
  263.   245                                    XTRHEAD:
  264.   246      0284    00                        db    0
  265.   247      0285    003F                      dw    XTRTOP-XTRACT
  266.   248                                        ;
  267.   249                                        .dephase
  268.   250                                        ;
  269.   251                                        .phase    0
  270.   252                                        ;
  271.   253      0000    2A 03F7               XTRACT:    LHLD    MAGIC    ; HL =.(byte array)
  272.   254                                        LBCD    MAGIC+2    ;  C = starting bit number
  273. Xtract field from and insert field into buffer    MACRO-80 3.31    29-Jun-79    PAGE    1-6
  274.  
  275.  
  276.   255      0003    ED 4B                       db    0EDH,4BH
  277.   256      0005    03F9                        dw    MAGIC+2
  278.   257      0007    3A 03FB                   LDA    MAGIC+4    
  279.   258      000A    47                        MOV    B,A    ;  B = field width in bits
  280.   259      000B    0D                        DCR    C    ; bit no.  1..N -> 0..(N-1)
  281.   260      000C    79                        MOV    A,C
  282.   261      000D    E6 F8                     ANI    not 7
  283.   262      000F    0F                        RRC
  284.   263      0010    0F                        RRC
  285.   264      0011    0F                        RRC
  286.   265      0012    5F                        MOV    E,A
  287.   266      0013    16 00                     MVI    D,0    ; DE = byte offset
  288.   267      0015    19                        DAD    D    ; HL = .(bytes containing bits of interest)
  289.   268      0016    79                        MOV    A,C
  290.   269      0017    E6 07                     ANI    7
  291.   270      0019    4F                        MOV    C,A    ; C = bit number mod bytesize (i.e. 8)
  292.   271      001A    0C                        INR    C    ; 0..7 -> 1..8
  293.   272      001B    EB                        XCHG        ; DE = .(bytes of interest)
  294.   273      001C    13                        INX    D
  295.   274      001D    13                        INX    D    ; Could be spread across 3 bytes
  296.   275      001E    1A                        LDAX    D    ; get them in H'L'A
  297.   276      001F    67                        MOV    H,A
  298.   277      0020    1B                        DCX    D
  299.   278      0021    1A                        LDAX    D
  300.   279      0022    6F                        MOV    L,A
  301.   280      0023    1B                        DCX    D
  302.   281      0024    1A                        LDAX    D
  303.   282      0025    0D                    LOOP:    DCR    C    ; Right justify in H'L'A
  304.   283                                        JRZ    JUSTDN    ; Is right justification complete ?
  305.   284      0026    28 07                       db    28H,JUSTDN-$-1
  306.   285                                        SRAR    H    ; No
  307.   286      0028    CB 2C                       db    0CBH, 28H+H
  308.   287                                        RARR    L
  309.   288      002A    CB 1D                       db    0CBH, 18H +L
  310.   289      002C    1F                        RAR
  311.   290                                        JMPR    LOOP
  312.   291      002D    18 F6                       db    18H,LOOP-$-1
  313.   292                                        ;
  314.   293      002F    55                    JUSTDN:    MOV    D,L
  315.   294      0030    5F                        MOV    E,A    ; max 16 bit field right justified in D'E
  316.   295      0031    21 0001                   LXI    H,1    ; Calculate the field width mask
  317.   296      0034    29                    MSKLUP:    DAD    H
  318.   297                                        DJNZ    MSKLUP
  319.   298      0035    10 FD                       db    10H,MSKLUP-$-1
  320.   299      0037    2B                        DCX    H    ; HL = 2**width -1
  321.   300      0038    7A                        MOV    A,D
  322. Xtract field from and insert field into buffer    MACRO-80 3.31    29-Jun-79    PAGE    1-7
  323.  
  324.  
  325.   301      0039    A4                        ANA    H
  326.   302      003A    67                        MOV    H,A
  327.   303      003B    7B                        MOV    A,E
  328.   304      003C    A5                        ANA    L
  329.   305      003D    6F                        MOV    L,A    ; HL = extracted value
  330.   306      003E    C9                        RET
  331.   307                                        ;
  332.   308                                    XTRTOP:
  333.   309      003F    0000                      dw    0
  334.   310                                        ;
  335.   311                                        .dephase
  336.   312                                        ;
  337.   313                                        ;
  338.   314                                    FINIS:    end    ZERO
  339. Xtract field from and insert field into buffer    MACRO-80 3.31    29-Jun-79    PAGE    S
  340.  
  341.  
  342. Macros:
  343. @CHK    BIT    DJNZ    JMPR    JRC    JRNC    JRNZ    JRZ
  344. LBCD    LDED    RALR    RARR    RES    RLCR    RRCR    SETB
  345. SLAR    SRAR    SRLR    
  346.  
  347. Symbols:
  348. ADOK    0030     FINIS    03C8     INSERT    0000     INSHEA    0205 
  349. INSTOP    007A     JUSTDN    002F     LJDUN    0070     LJLUP    0061 
  350. LOOP    0025     MAGIC    03F7     MSKLUP    0034     MSLUP    0014 
  351. RJDUN    0051     RJLUP    0042     XTRACT    0000     XTRHEA    0284 
  352. XTRTOP    003F     ZERO    0000     
  353.  
  354.  
  355.  
  356. No  Fatal error(s)
  357.  
  358.  
  359.  
  360. ADOK      128      130#
  361. DJNZ      104      297
  362. FINIS       37      314#
  363. INSERT       83       91#
  364. INSHEA       31       81#
  365. INSTOP       83      204#
  366. JMPR      160      193      290
  367. JRNC      127      156      189
  368. JRZ      149      182      283
  369. JUSTDN      284      293#
  370. LBCD       95      254
  371. LDED       92
  372. LJDUN      183      196#
  373. LJLUP      180#      190      194
  374. LOOP      282#      291
  375. MAGIC       23#       91       94       97       98      253      256      257
  376. MSKLUP      296#      298
  377. MSLUP      103#      105
  378. RALR      185      187
  379. RARR      151      153      287
  380. RJDUN      150      163#
  381. RJLUP      147#      157      161
  382. SETB      158      191
  383. SRAR      285
  384. XTRACT      247      253#
  385. XTRHEA       34      245#
  386. XTRTOP      247      308#
  387. ZERO       29#       38      314
  388.  
  389. TOP       83      204#
  390. JMPR      160      193      290
  391. JRNC      127      156      189
  392. JRZ      149      182      283
  393. JUSTDN      284      293#
  394. LBCD       95      2